import { Injectable } from '@nestjs/common';
import { getAgent, getAgentWithConfig } from './utils/model';
// import { data } from './utils/data';
import {
  useResponseData,
  useResponseDataSimple,
} from './utils/useResponseData';
import { useResponseDataGen } from './utils/useResponseDataGen';

@Injectable()
export class GisService {
  async chatMessage(body: {
    chatSessionId: string;
    messagesList: any[];
    modelConfig?: {
      temperature?: number;
      maxTokens?: number;
      model?: string;
      streaming?: boolean;
    };
  }) {
    const thread_id = body.chatSessionId;

    // 根据配置选择 agent
    const agent = body.modelConfig
      ? await getAgentWithConfig(body.modelConfig)
      : await getAgent();

    // 构建系统提示词，包含数据源信息
    const systemPrompt = `你是一个GIS开发专家，精通各种GIS开发技术。
请根据以下数据源回答用户问题：

数据字段说明：
- url: 3D图
- lng: 空间坐标（经度）
- lat: 空间坐标（纬度）
- x: 坐标角度
- d: 房间号
- height: 距离地面高度
- user: 户主

请用中文简洁专业地回答用户问题。`;

    const promptList = thread_id
      ? []
      : [{ type: 'system', content: systemPrompt }];
    promptList.push(...body.messagesList);

    const getAgentStream = () =>
      agent.stream(
        { messages: promptList },
        // 流式输出 LLM tokens
        { streamMode: 'messages', configurable: { thread_id } },
      );

    const getAgentInvoke = () =>
      agent.invoke({ messages: promptList }, { configurable: { thread_id } });

    return await useResponseDataSimple({
      getAgentInvoke,
      getAgentStream,
      isStream: body.modelConfig?.streaming,
      sessionId: thread_id,
    });
  }
  async chatMessageGen(body: {
    chatSessionId: string;
    messagesList: any[];
    modelConfig?: {
      temperature?: number;
      maxTokens?: number;
      model?: string;
      streaming?: boolean;
    };
  }) {
    const thread_id = body.chatSessionId;
    // 根据配置选择 agent
    const agent = body.modelConfig
      ? await getAgentWithConfig(body.modelConfig)
      : await getAgent();

    // 构建系统提示词，包含数据源信息
    //     const systemPrompt = `你是一个GIS开发专家，精通各种GIS开发技术。
    // 请根据以下数据源回答用户问题：

    // 数据字段说明：
    // - url: 3D图
    // - lng: 空间坐标（经度）
    // - lat: 空间坐标（纬度）
    // - x: 坐标角度
    // - d: 房间号
    // - height: 距离地面高度
    // - user: 户主

    // 请用中文简洁专业地回答用户问题。`;

    const promptList: any[] = [];

    // body.chatSessionId
    //   ? []
    //   : [{ type: 'system', content: systemPrompt }];
    promptList.push(...body.messagesList);

    const getAgentStream = () =>
      agent.stream(
        { messages: promptList },
        // 流式输出 LLM tokens
        {
          streamMode: 'messages',
          configurable: { thread_id, enable_thinking: true },
        },
      );

    const getAgentInvoke = () =>
      agent.invoke({ messages: promptList }, { configurable: { thread_id } });

    const res = useResponseDataGen({
      getAgentInvoke,
      getAgentStream,
      isStream: body.modelConfig?.streaming,
      sessionId: thread_id,
    });
    return res;
  }

  // 新增：获取对话历史
  async getChatHistory(sessionId: string) {
    const agent = await getAgent();

    try {
      // 获取指定会话的对话历史
      const state = await agent.getState({
        configurable: { thread_id: sessionId },
      });

      return {
        code: 200,
        data: { messages: state.values.messages || [], sessionId: sessionId },
      };
    } catch (error) {
      console.error('获取对话历史失败:', error);
      return {
        code: 500,
        data: { error: '获取对话历史失败', sessionId: sessionId },
      };
    }
  }

  // 新增：清除对话历史
  async clearChatHistory(sessionId: string) {
    const agent = await getAgent();

    try {
      // 清除指定会话的对话历史
      await agent.updateState(
        { configurable: { thread_id: sessionId } },
        { messages: [] },
      );

      return {
        code: 200,
        data: { message: '对话历史已清除', sessionId: sessionId },
      };
    } catch (error) {
      console.error('清除对话历史失败:', error);
      return {
        code: 500,
        data: { error: '清除对话历史失败', sessionId: sessionId },
      };
    }
  }
}
